﻿using Newtonsoft.Json.Linq;
using System;

namespace MockNetCore.Handlers
{
    public class ArrayHandler : TypeHandler
    {
        public object handle(Options options)
        {
            JArray jaR = new JArray();

            if (options.rule.parameters == null || options.rule.parameters.Count == 0)
            {
                JArray templates = (JArray)options.template;
                for (int i = 0; i < templates.Count; i++)
                {
                    Context context = new Context();
                    jaR.Add(Handler.gen(templates[i], i + "", context));
                }
                return jaR;
            }
            // 'method|1': ['GET', 'POST', 'HEAD', 'DELETE']
            if (options.rule.min != null && options.rule.min == 1 && options.rule.max == null)
            {
                JArray ja = (JArray)Handler.gen(options.template, null, options.context);
                return ja[new Random().Next(0, ja.Count)];
            }

            // 'data|+1': [{}, {}]
            if (!string.IsNullOrEmpty(options.rule.parameters[1]))
            {
                JArray ja = (JArray)Handler.gen(options.template, null, options.context);
                int index = options.context.orderIndex >= ja.Count ? 0 : options.context.orderIndex;
                options.context.orderIndex = index + 1;
                return ja[index];
            }
            // 'data|1-10': [{}]
            for (int i = 0; i < options.rule.count; i++)
            {
                // 'data|1-10': [{}, {}]

                JArray templates = (JArray)options.template;
                for (int j = 0; j < templates.Count; j++)
                {
                    jaR.Add(Handler.gen(templates[j], jaR.Count + "", options.context));
                }
            }
            return jaR;
        }

        public Type[] support()
        {
            return new Type[] { typeof(JArray) };
        }
    }
}